let obj = {};
obj["prop"] = "正常属性";
obj[Symbol("prop")] = "匿名属性";//Symbol()值做属性
console.log("-->1", JSON.stringify(obj));//{"prop":"正常属性"}这个用处挺好

obj.foo = function () {
    return "成员函数";
}
let fooS = Symbol("foo");
obj[fooS] = function () {
    return "匿名函数";
}
console.log("-->2", Object.keys(obj));//['prop', 'foo']，Symbol()值做属性，为匿名属性，不会出现在对象key值表中
for (const v in obj) {//Symbol()值做属性，为匿名属性，不可枚举，不会被遍历
    console.log("-->3", v);//prop，foo
}
console.log("-->4", Object.getOwnPropertyNames(obj));//['prop', 'foo']，Symbol()值做属性，为匿名属性，不会出现在属性名中
console.log("-->5", Object.getOwnPropertySymbols(obj));//[Symbol(prop), Symbol(foo)]，Symbol()值做属性，为匿名属性，只能通过这种方式拿到
console.log(obj[Symbol("prop")]);//undefined,每次Symbol()都只会产生唯一值，参数只是个描述作用，方便调试，没有实际意义

let propS1 = Symbol("prop1")
let propS2 = Symbol.for("prop2");
obj[propS1] = "prop1";
obj[propS2] = "prop2";
//Symbol()构造值，无法重新获取
console.log("===1", obj[propS1], obj[Symbol.for("prop1")]);
//Symbol.for(key)构造值，会被记录在全局的Symbol注册表，通过相同的key可实现重新获取，另外可通过Symbol.keyFor()获取key
console.log("===2", obj[propS2], obj[Symbol.for("prop2")], Symbol.keyFor(propS2), Symbol.keyFor(Symbol.for("prop2")));


//获取属性描述，这有什么用？
console.log("-->6", Object.getOwnPropertyDescriptor(obj));
console.log("-->7", Object.getOwnPropertyDescriptors(obj));